جزوه · جستجو با فرمان grep ← بازگشت به فهرست
📘 فصل اول · جلسه چهاردهم جستجو با فرمان grep
📅 تاریخ: ۱۸ مرداد ۱۴۰۵ 👤 مدرس: محمد عابدینی 🐚 Zsh · 🐧 Debian

▍ مقدمه

grep یکی از قدرتمندترین و پرکاربردترین ابزارهای خط فرمان در لینوکس است. نام grep مخفف Global Regular Expression Print است.

🔑 کاربرد اصلی:

grep برای جستجوی یک الگو (Pattern) در فایل‌ها یا خروجی دستورات استفاده می‌شود و خطوطی که با آن الگو مطابقت داشته باشند را نمایش می‌دهد.

کاربردهای رایج در مدیریت سیستم:

▍ ساختار کلی دستور grep

grep [options] pattern [file(s)]

توضیح: الگوی جستجو، گزینه‌ها و فایل(هایی) که باید جستجو شوند.

• مثال‌های پایه

┌──(ya3in㉿kali)-[~] └─$ grep root /etc/passwd root:x:0:0:root:/root:/bin/bash

جستجوی کلمه root در فایل /etc/passwd.

┌──(ya3in㉿kali)-[~] └─$ grep "sh$" /etc/passwd root:x:0:0:root:/root:/bin/bash
user:x:1000:1000:User:/home/user:/bin/bash

جستجوی خطوطی که با sh پایان می‌یابند. ($ یعنی انتهای خط)

┌──(ya3in㉿kali)-[~] └─$ grep -v bash /etc/passwd

معکوس (Invert): نمایش خطوطی که شامل bash نیستند.

دستورات پرکاربرد grep

📌 خلاصه دستورات پرکاربرد grep

▍ گزینه‌های مهم grep

گزینه توضیح
-i جستجوی بدون حساسیت به حروف بزرگ/کوچک (Case-Insensitive)
-v نمایش خطوطی که با الگو مطابقت ندارند (Invert Match)
-r یا -R جستجوی بازگشتی در دایرکتوری‌ها و زیردایرکتوری‌ها
-n نمایش شماره خط (Line Number)
-c فقط نمایش تعداد خطوط مطابق (Count)
-l فقط نمایش نام فایل‌های حاوی الگو (Files with match)
-w جستجوی کلمه کامل (Whole Word)
-A N نمایش N خط بعد از خط پیدا شده (After)
-B N نمایش N خط قبل از خط پیدا شده (Before)
-C N نمایش N خط قبل و بعد (Context)
-E استفاده از عبارت با قاعده گسترده (Extended Regex) — معادل egrep
-F الگو را به عنوان رشته ثابت در نظر بگیر (معادل fgrep)
--color=auto هایلایت کردن الگوی پیدا شده با رنگ

▍ مثال‌های پیشرفته

• جستجوی بدون حساسیت به حروف بزرگ/کوچک

┌──(ya3in㉿kali)-[~] └─$ grep -i error /var/log/syslog

جستجوی کلمه error (با هر حالت نوشتاری: error, ERROR, Error) در فایل لاگ سیستم.

• جستجوی بازگشتی در دایرکتوری

┌──(ya3in㉿kali)-[~] └─$ grep -r "password" /etc/

جستجوی کلمه password در همه فایل‌های دایرکتوری /etc/ و زیردایرکتوری‌های آن.

• نمایش شماره خطوط

┌──(ya3in㉿kali)-[~] └─$ grep -n "root" /etc/passwd 1:root:x:0:0:root:/root:/bin/bash

نمایش شماره خط (۱) همراه با خط پیدا شده.

• فقط شمارش تعداد

┌──(ya3in㉿kali)-[~] └─$ grep -c "root" /etc/passwd 1

فقط تعداد خطوطی که شامل root هستند را نشان می‌دهد.

• جستجوی کلمه کامل

┌──(ya3in㉿kali)-[~] └─$ grep -w "to" file.txt

فقط کلمه to را پیدا می‌کند، نه کلماتی مثل today یا tomorrow.

• نمایش خطوط قبل و بعد

┌──(ya3in㉿kali)-[~] └─$ grep -A 2 -B 1 "error" logfile.txt

نمایش ۱ خط قبل و ۲ خط بعد از هر خط حاوی error.

▍ استفاده از grep با پایپ (Pipe)

یکی از قدرتمندترین کاربردهای grep، فیلتر کردن خروجی سایر دستورات است.

┌──(ya3in㉿kali)-[~] └─$ ps aux | grep firefox

پیدا کردن فرایندهای مربوط به firefox.

┌──(ya3in㉿kali)-[~] └─$ history | grep "sudo"

پیدا کردن دستورات قبلی که با sudo شروع شده‌اند.

┌──(ya3in㉿kali)-[~] └─$ ls -la | grep "^d"

نمایش فقط دایرکتوری‌ها (خطوطی که با d شروع می‌شوند).

▍ اصطلاحات و مفاهیم کلیدی

📌 مفاهیم مهم:
  • خط خالی (Blank Line): خطی که هیچ کاراکتری ندارد. با الگوی ^$ قابل جستجو است (^ = ابتدای خط، $ = انتهای خط).
  • ابتدای خط (^): با ^pattern خطوطی که با الگو شروع می‌شوند را پیدا می‌کند.
  • انتهای خط ($): با pattern$ خطوطی که به الگو ختم می‌شوند را پیدا می‌کند.

• مثال‌های کاربردی با ^ و $

┌──(ya3in㉿kali)-[~] └─$ grep "^root" /etc/passwd

خطوطی که با root شروع می‌شوند.

┌──(ya3in㉿kali)-[~] └─$ grep "bash$" /etc/passwd

خطوطی که به bash ختم می‌شوند.

┌──(ya3in㉿kali)-[~] └─$ grep "^$" file.txt

پیدا کردن خطوط خالی در فایل.

┌──(ya3in㉿kali)-[~] └─$ grep -v "^$" file.txt

حذف خطوط خالی از فایل.

▍ ترکیب با find

می‌توانید grep را با find ترکیب کنید تا در میان فایل‌های خاص جستجو کنید:

┌──(ya3in㉿kali)-[~] └─$ find /etc -name "*.conf" -exec grep -l "error" {} \;

پیدا کردن فایل‌های .conf که شامل کلمه error هستند.

▍ خلاصه دستورات

دستور کاربرد
grep pattern file جستجوی الگو در فایل
grep -i pattern file جستجوی بدون حساسیت به حروف بزرگ/کوچک
grep -v pattern file نمایش خطوطی که الگو را ندارند
grep -n pattern file نمایش با شماره خط
grep -c pattern file فقط تعداد خطوط مطابق
grep -r pattern /path/ جستجوی بازگشتی در دایرکتوری
grep -w pattern file جستجوی کلمه کامل
grep "^pattern" file خطوطی که با الگو شروع می‌شوند
grep "pattern$" file خطوطی که به الگو ختم می‌شوند
cmd | grep pattern فیلتر کردن خروجی یک دستور
✅ تمرین پیشنهادی:
  • در فایل /etc/passwd کاربرانی که از /bin/bash استفاده می‌کنند را پیدا کنید.
  • با grep -i کلمه error را در /var/log/syslog جستجو کنید.
  • با ps aux | grep فرایندهای مربوط به firefox یا chrome را پیدا کنید.
  • خطوط خالی یک فایل را با grep -v "^$" حذف کنید.
  • با grep -r یک کلمه خاص را در دایرکتوری /etc/ جستجو کنید.